   EnotVM32  https://chat.deepseek.com/

 1.  
 EnotVM32    32?   (),
   Turbo Pascal 4.0.    ,
      (`BOOT.bin`).  ,
   糺 MIT.

 :
-   ,      ;
-    x86 (  );
-   FASM   ;
-    .


 2.    

1.   `EnotVM32`   `C:\EnotVM32\BP4_001\`.
      :
   - `EnotVM32.EXE`   ;
   -  `*.BGI`   (    );
   -  `Examples\`  .

2.   (, `Examples\hello\BOOT.bin`)   
    `BP4_001\`.

3.  `EnotVM32.EXE`    `BOOT.bin`   .


 3.    (  FASM)

    flat assembler (FASM)  1.73  
  .

 3.1.  FASM

-     (https://flatassembler.net/download.php):
  - `fasm17335.zip` ( DOS)  `fasmw17335.zip` ( Windows).
- , ,  `C:\FASMdos\`  `C:\FASMwin\`.

 3.2.  
     :
- `Macros.asm`   ,      
  EnotVM32 ( ).
- `BOOT.asm`    .
- `BOOT.bin`    (  ).

 3.3. 
       (DOS / Windows)
  bat? (   ):
- `EditDos.bat`      DOS? FASM.
- `EditWin.bat`     Windows.

   `Ctrl+F9`    `BOOT.bin`.

     
- `ComplDos.bat`  `ComplWin.bat`   FASM.
- :  bat-    `BOOT.bin`.
     ,   `del BOOT.bin`
  ( `REM`  ).

ϳ   `BOOT.bin`    `EnotVM32.EXE`
  .



 4.  EnotVM32

 4.1. 
- 256 32-  ( `RegsDW[0..255]`).
-  :  `AA`  `JV` (  FASM 
  `_`,  `AH_`, `AL_`).
-  :  `A`  `Z` ( `AA`  `AZ`).

-  :
  - `CMP1` (254), `CMP2` (255)    .
  - `YA..YH` (232239)       `EXTR`.
  - `ZA..ZH` (240247)     `EXTR`.

  -  `RgEIP` ( )  `RgESP` ( )
     `MOV`,     
  `EXTR`.

  4.2. 
-  :   `RAM[0..cSizeOfRAM]`,   48 
  (49152 ,  0..49151).     `uTpDt.pas`
  ( `cSizeOfRAM`).
-  :  11  (`cMaxPagesOfRAMext = 10`)  48 
  .      .
     `EXTR`- .

 4.3. 
-   `RAMc[0..cSizeOfRAMstack] of Int32`
  (  256 ).
- `RgESP`   Int32,   .  
  `cSizeOfRAMstack` ( ).
-  `PUSH`/`POP`  `RgESP`  1.

 4.4.  
-     32-  ( 2147483648  2147483647).
-   (`ADD`, `SUB`, `MUL`, `DIV`, `MOD`)  
   .
-   (`AND`, `OR`, `XOR`, `NOT`, `SHL`, `SHR`)  .
-  `SHL`/`SHR`   32? ;  
    .


 5.  

   (, , , )   
`02  EnotVM32.txt`.    .


 5.1. NOP
`00`  `nop_` (1 )    .

 5.2.   (MOV)
     :   (`[imm32]`)
    (`[Rg]`),    : 32  (MOV),
 16  (MOV2), 8  (MOV1).

 32? ( < /):
- `01` MOVrv Rg, imm32
- `02` MOVrr Rg1, Rg2
- `03` MOVrm Rg, [imm32]
- `04` MOVrmr Rg1, Rg2 (Rg1 := [Rg2])
- `05` MOVmr [imm32], Rg
- `06` MOVmrr Rg1, Rg2 ([Rg1] := Rg2)

 16? (    32 ):
- `07` MOV2rm Rg, [imm32]
- `2B` MOV2rmr Rg1, Rg2
- `08` MOV2mr [imm32], Rg (  16 )
- `2C` MOV2mrr Rg1, Rg2

 8? (    32 ):
- `09` MOV1rm Rg, [imm32]
- `2D` MOV1rmr Rg1, Rg2
- `0A` MOV1mr [imm32], Rg
- `2E` MOV1mrr Rg1, Rg2

 5.3.   
- `0B` CALLa imm16      .
- `0C` CALLr Rg      .
- `0D` RET  .
- `0E` GOTOa imm16   .
- `0F` GOTOr Rg     .

 5.4.   ()
  `CMP1`  `CMP2`.    
`CMPrr` (`29`)  ? `MOV`.

- `10` GOTOsaIs imm16   CMP1 = CMP2
- `11` GOTOsaNotIs imm16   CMP1 ? CMP2
- `12` GOTOsaMoreIs imm16   CMP1 ? CMP2
- `13` GOTOsaLess imm16   CMP1 < CMP2
- `14`-`17`    ,      (GOTOsr...).

 5.5.  
- `18` PUSHr Rg     .
- `19` POPr Rg    .
- `1A` PUSHrsvr Rg1, Rg2      Rg1..Rg2.
- `1B` POPrsvr Rg1, Rg2   .

 5.6.     ()
`1C` ADD, `1D` SUB, `1E` MUL, `1F` DIV, `20` MOD,
`21` INC, `22` DEC,
`23` AND, `24` OR, `25` XOR, `26` NOT,
`27` SHL, `28` SHR.

,  `INC`, `DEC`, `NOT`,   3 
(`opcode + Rg1 + Rg2`). `INC`, `DEC`, `NOT`  2 .

 5.7. 
`29` CMPrr Rg1, Rg2   Rg1  CMP1, Rg2  CMP2.

 5.8.   EXTR
`2A` EXTR word_value     ( ).
       .


 6.   EXTR

 `EXTR` ( `2Ah`)  16? ,   
  .     `YA..YH` 
 ,     `ZA..ZH`.

    .


 6.1.  0 ()

|  |                                |  |  |  |
|-------|-------------------------------------|--------|---------|------|
| 0     | EXTR_NOP                            |       |        |   ( ) |
| 1     | CheckEXTR                           | YA =   | ZA=1 , ZA=0   |   EXTR? |
| 2     | HALT_                               | YA =      |        |    (Halt) |
| 3     | Writeln_GetTimeStr                  |       |        |    (::.) |
| 4     | Readln0                             |       |        |   Enter |
| 5     | VersionEnotVM                       |       | ZA =  |  EnotVM ( cVersionEnotVM) |
| 6     | Writeln0                            |       |        |    |
| 7     | CONT                                |       |        |  Will Enter 'cont' or 'CONT' for continue    |
| 8     | WritelnYA                           |       |        |   YA      |
| 9     | Wait00secTime_and_Writeln_GetTimeStr|       |        | ,     0,    |
| 10    | EndProgram                          |       |        |     |
| 11    | TypeOfAmbience                      |       | ZA = 1 (16-)  2 (32-) |   |
| 12    | APM                                 |       |        |   (),  pSTOPEngine=3 |
| 13    | SizeOfRAMstack                      |       | ZA =   ( ) | |
| 14    | SizeOfRAM                           |       | ZA = cSizeOfRAM |    |
| 15    | SizeOfRAMext                        |       | ZA = cSizeOfRAMext |     |
| 16    | MaxPagesOfRAMext                    |       | ZA = cMaxPagesOfRAMext | ʳ  ( 0  ) |
| 17    | ( )             |       | ZA = cEnotVMItIsCompiled |   (1 = TP 4.0) |


 6.2.  1   / (256511)

|  |         |  |  |  |
|-------|--------------|--------|---------|------|
| 256   | WritelnStr   | YA =      |  |      |
| 257   | WriteStr     | YA =   |  |      |

     :
- 1    (`1``4`),
-      ,
-   .

 6.3.  2    (512767)
   :
- `YB`    (Count)
- `YC`, `YD`, `YE`, `YF`  /  (. )

|  |            |                                                          |
|-------|-----------------|-------------------------------------------------------------------|
| 512   | CopyMainToMain  | YC = Src, YB = Count, YE = Dst                                    |
| 513   | CopyMainToExt   | YC = MainSrc, YB = Count, YF = PageDst, YE = ExtDst               |
| 514   | CopyExtToMain   | YD = PageSrc, YC = ExtSrc, YB = Count, YE = MainDst               |
| 515   | CopyExtToExt    | YD = PageSrc, YC = ExtSrc, YB = Count, YF = PageDst, YE = ExtDst  |

:      
(  `Move`).

 6.4.  3     (7681023)
ֳ    `CMP1`/`CMP2`   32? 
( ,  ).

|  |           | ĳ                                                           |
|-------|----------------|---------------------------------------------------------------|
| 768   | GOTOuaMoreIs   |  CMP1 ? CMP2 ()    16?   |
| 769   | GOTOuaLess     |  CMP1 < CMP2                                      |
| 770   | GOTOurMoreIs   |  ,    ,   EXTR          |
| 771   | GOTOurLess     |                                                     |

 7.   
 `BOOT.asm` (   `Macros.asm`):

asm
format binary as 'bin'
include 'Macros.asm'

;  "Hello, World!"  
    MOVrv A, hello_string    ; YA :=  
    EXTR 256                 ; WritelnStr
    EXTR 10                  ; EndProgram

hello_string:
    db 1, 13, 13            ;  1,  =13, =13
    db 'Hello, World!'


ϳ   `BOOT.bin`   `EnotVM32.EXE` 
.

 8. ˳
   "MIT License".   糿  
  `LICENSE`.    ,  
   ,    .


---

        .

